package com.ato.java;

/**
 * @author wangjing
 * @create 2021--08--07--22:00
 */

/**
 * abstract  : 抽象类  可以看成是关键字的使用
 *      final 关键字是不能继承，  abstract 是不能 具体实例化 即：不能new 只能extends
 *
 *      可以修饰的结构
 *          1：类
 *                  抽象类必须要提供构造器  便于子类实例化时调用，开发中一般都会提供抽象类的子类
 *
 *          2：方法：抽象方法
 *                  注意，不能修饰私有方法、静态方法  final修饰的方法（final修饰的方法不能重写。子类要继承抽象类父类的方法时，如果有抽象方法，是需要重写的！！！
 *                  没有方法体：只有方法名，没有{xxxx};
 *                  子类要继承抽象父类，那么必须：
 *                          0：如果子类也要实例化。那么就要重写该方法
 *                          1：子类重写父类的抽象方法
 *                          2：子类也是抽象方法。。。
 *                          即：有抽象方法的类必须是抽象类。但是抽象类中可以不是必须含有抽象方法
 */
public class AbstractTest {
    public static void main(String[] args) {

//        As as = new As(); //  报错
        B b = new B();
    }
}

// 加上abstract后则不能 实例化
abstract class As {
    String name;
    int age;

    //    抽象类必须要提供构造器  便于子类实例化时调用，开发中一般都会提供抽象类的子类
    public As() {
    }

    public As(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat() {
        System.out.println("非抽象方法");
    }
//    抽象方法：没有方法体
    public abstract void  walk();
}

class B extends As {
//    父类中的抽象方法：重写
    @Override
    public void walk() {

    }
}